package com.jxb.visibility.future;

import java.util.Random;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;

/**
 * thenCombine：结果组合-获取2个任务的结果
 * 结果转换(第一个任务执行完才会去执行下一个任务)：thenApply-用的同一个future，thenCompose-需要重写用一个新的future
 *
 *
 * @author jiaobo
 * @date Created in 2024/12/5 0:46
 **/
public class CompletableFutureDemo {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // ExecutorService excutor = Executors.newFixedThreadPool(10);
        // CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> {
        //     System.out.println("厨师炒菜");
        //     try {
        //         Thread.sleep(2000);
        //     } catch (InterruptedException e) {
        //         e.printStackTrace();
        //     }
        //     return "西红柿炒番茄好了";
        // }).thenCombine(CompletableFuture.supplyAsync(()->{
        //     System.out.println("服务员蒸饭");
        //     try {
        //         Thread.sleep(3000);
        //     } catch (InterruptedException e) {
        //         e.printStackTrace();
        //     }
        //     return "米饭蒸好了";
        // }),(dish,rice)->{
        //     System.out.println("服务员打饭");
        //     try {
        //         Thread.sleep(1000);
        //     } catch (InterruptedException e) {
        //         e.printStackTrace();
        //     }
        //     return dish+","+rice;
        // });

        System.out.println("啵啵吃饭了... ...");

        // CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
        //     System.out.println("服务员收款");
        //     try {
        //         Thread.sleep(1000);
        //     } catch (InterruptedException e) {
        //         e.printStackTrace();
        //     }
        //     return "20";
        // })  .thenApply(money -> {
        //     System.out.println("服务员开发票，面额100原");
        //     try {
        //         Thread.sleep(2000);
        //     } catch (InterruptedException e) {
        //         e.printStackTrace();
        //     }
        //     return "100";
        // });
        // System.out.println("拿到发票，准备回家："+future.join());

        // CompletableFuture<String> 服务员收款 = (CompletableFuture<String>) CompletableFuture.supplyAsync(() -> {
        //     System.out.println("服务员收款");
        //     try {
        //         Thread.sleep(1000);
        //     } catch (InterruptedException e) {
        //         e.printStackTrace();
        //     }
        //     return "20";
        // }).thenCompose(CompletableFuture.supplyAsync(() -> {
        //     System.out.println("服务员开发票，面额100原");
        //     try {
        //         Thread.sleep(2000);
        //     } catch (InterruptedException e) {
        //         e.printStackTrace();
        //     }
        //     return "500";
        // }));

        //结果转换
        // System.out.println("啵啵吃饭了... ...");
        //
        // CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
        //     try {
        //         Thread.sleep(3000);
        //     } catch (InterruptedException e) {
        //         e.printStackTrace();
        //     }
        //     System.out.println("第一阶段");
        //     return 10;
        // });
        //
        // CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
        //     try {
        //         Thread.sleep(2000);
        //     } catch (InterruptedException e) {
        //         e.printStackTrace();
        //     }
        //     System.out.println("第二阶段");
        //     return 5;
        // });
        //
        // future1.thenAcceptBoth(future2, new BiConsumer<Integer, Integer>() {
        //     @Override
        //     public void accept(Integer integer, Integer integer2) {
        //         System.out.println("最终结果：" + (integer + integer2));
        //     }
        // }).get();


        //结果处理
        // CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
        //     try {
        //         TimeUnit.SECONDS.sleep(1);
        //     } catch (InterruptedException e) {
        //     }
        //     if (new Random().nextInt(10) % 2 == 0) {
        //         int i = 12 / 0;
        //     }
        //     System.out.println("执行结束！");
        //     return "test";
        // });
        //
        // future.whenComplete(new BiConsumer<String, Throwable>() {
        //     @Override
        //     public void accept(String t, Throwable action) {
        //         System.out.println(t+"执行完成！");
        //     }
        // }).get();
        //
        // future.exceptionally(new Function<Throwable, String>() {
        //     @Override
        //     public String apply(Throwable t) {
        //         System.out.println("执行失败：" + t.getMessage());
        //         return "异常xxxx";
        //     }
        // }).get();

    }

}
